package com.yang.mall.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.yang.mall.dao.ProductMapper;
import com.yang.mall.pojo.Product;
import com.yang.mall.service.ICategoryService;
import com.yang.mall.service.IProductService;
import com.yang.mall.vo.ProductDetailVo;
import com.yang.mall.vo.ProductVo;
import com.yang.mall.vo.ResponseVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

import static com.yang.mall.enums.ResponseEnum.PRODUCT_OFF_SALE_OR_DELETE;
import static com.yang.mall.enums.ProductStatusEnum.OFF_SALE;
import static com.yang.mall.enums.ProductStatusEnum.DELETE;

@Slf4j
@Service
public class ProductServiceImpl implements IProductService {
    @Autowired
    ICategoryService categoryService;
    @Autowired
    ProductMapper productMapper;

    @Override
    // 这是一个商品展示，但是可以通过iD查询对应商品并控制分页上传到前端
    public ResponseVo<PageInfo> list(Integer categoryId, Integer pageNum, Integer pageSize) {
        Set<Integer> categoryIdSet = new HashSet<>();
        // 为null 的时候 通过productMapper.xml里面的sql语句进行全查询
        if (categoryId != null){
            categoryService.findSubCategoryId(categoryId, categoryIdSet);
            categoryIdSet.add(categoryId);
        }
        // 进行分页配置，只要用这个函数就可了，相当于自带一个拦截器，在底层发sql语句的时候它会自动发关于分页的数据
        PageHelper.startPage(pageNum, pageSize);
        List<Product> productsList = productMapper.selectByCategoryIdSet(categoryIdSet);
        List<ProductVo> productVoList = productsList.stream()
                .map(e -> {
                    ProductVo  productVo = new ProductVo();
                    // 拷贝数据赋值给productVo
                    BeanUtils.copyProperties(e ,productVo);
                    return productVo;
                }).collect(Collectors.toList());
        // 使用PageHelper插件提供的接口将 一些信息封装到pageInfo中
        PageInfo pageInfo = new PageInfo<>(productsList);
        pageInfo.setList(productVoList);
        return ResponseVo.success(pageInfo);
    }

    // 通过商品ID获取商品详情
    @Override
    public ResponseVo<ProductDetailVo> detail(Integer productId) {
        Product product = productMapper.selectByPrimaryKey(productId);
        //只对确定性条件判断  判断商品是否为上架状态
        if (product.getStatus().equals(OFF_SALE)
                || product.getStatus().equals(DELETE.getCode())) {
            return ResponseVo.error(PRODUCT_OFF_SALE_OR_DELETE);
        }

        ProductDetailVo productDetailVo = new ProductDetailVo();
        BeanUtils.copyProperties(product, productDetailVo);
         // 隐藏真实库存值
        productDetailVo.setStock(product.getStatus() > 100 ? 100 : product.getStatus());
        return ResponseVo.success(productDetailVo);
    }
}
